home *** CD-ROM | disk | FTP | other *** search
/ Utilities Professional 1-1500 / Utilities Professional 1-1500 (1994)(WPD)[!].iso / 12511500 / var1463.dms / var1463.adf / BBBBS72.lha / rexx / bbsUSER.rexx < prev    next >
OS/2 REXX Batch file  |  1993-07-27  |  10KB  |  363 lines

  1. /* $VER: bbsUSER.rexx 6.1 (27.7.93)
  2. counts upload/download statistics
  3. copyright 1990-93 Richard Lee Stockton 
  4.       - FREELY DISTRIBUTABLE -
  5. */
  6.  
  7. HOW_MANY=10
  8. CALL PRAGMA('P',-2)
  9. SIGNAL ON ERROR
  10. SIGNAL ON SYNTAX
  11. SIGNAL ON FAILURE
  12. NUMERIC DIGITS 14
  13.  
  14. CALL TIME('R')
  15. inarg=''
  16. PARSE ARG inarg .
  17. test=COMPRESS(UPPER(inarg),' -')
  18. IF test='?' | test='H' | test='USAGE' | test='HELP' THEN
  19.   DO
  20.     SAY 'Usage: rx bbsUSER [filename or CLI]'
  21.     SAY
  22.     SAY 'CLI writes to the console.'
  23.     SAY 'If a filename or the letters CLI are not included,'
  24.     SAY 'writes to a file called Information/STATS.USER'
  25.   END
  26.  
  27. IF inarg='' THEN
  28.   DO
  29.     CALL CLOSE(STDOUT)
  30.     CALL OPEN(STDOUT,'RAM:bbsUSER.STDOUT','W')
  31.   END
  32.  
  33. figarg='s:CONFIG.BBS'
  34. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  35. x=OPEN(f,figarg,'R')
  36. IF x=0 THEN
  37.   DO
  38.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  39.     EXIT(20)
  40.   END
  41.  
  42. CALL SETCLIP('BBS_STAT','ON')
  43. lynes.=''
  44. DO i=1 TO 6
  45.   lynes.i=READLN(f)
  46. END
  47. CALL CLOSE(f)
  48.  
  49. compos=POS('/*',lynes.1)
  50. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  51.  
  52. bbsname = STRIP(lynes.1)
  53. sysop   = WORD(lynes.2,1)
  54. bbspath = WORD(lynes.6,1)
  55. IF ~EXISTS(bbspath) THEN
  56.   DO
  57.     SAY bbspath 'does not exist!'
  58.     CALL SETCLIP('BBS_STAT')
  59.     EXIT(20)
  60.   END
  61. testchar=RIGHT(bbspath,1)
  62. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  63.  
  64. counts.=0
  65. DO j=1 TO HOW_MANY
  66.   counts.LOW.j=999999999
  67. END
  68. counts.AGE_YOUNGEST=99999999
  69. ten=0
  70. thirty=0
  71. ninty=0
  72. sixmo=0
  73. ndate=DATE('I')
  74. userlist=SHOWDIR(bbspath'Users','F')
  75. x=FIND(userlist,sysop)
  76. IF x>0 THEN userlist=DELWORD(userlist,x,1)
  77. DO i=1 TO WORDS(userlist)
  78.   thisuser=WORD(userlist,i)
  79.   x=OPEN(f,bbspath'Users/'thisuser,'R')
  80.   IF x=0 THEN
  81.     DO
  82.       SAY thisuser 'userfile would not open!'
  83.       ITERATE i
  84.     END
  85.   lynes.=''
  86.   DO j=1 TO 23
  87.     line=READLN(f)
  88.     IF EOF(f) THEN LEAVE j
  89.     lynes.j=line
  90.   END
  91.   CALL CLOSE(f)
  92.   IF j<23 THEN ITERATE i
  93.   callcount=WORD(lynes.19,6)
  94.   counts.CALLS=counts.CALLS+callcount
  95.   DO j=HOW_MANY TO 1 BY -1 WHILE callcount>counts.CALLS.j
  96.     jj=j+1
  97.     counts.CALLS.jj=counts.CALLS.j
  98.     counts.ID.CALLS.jj=counts.ID.CALLS.j
  99.     counts.CALLS.j=callcount
  100.     counts.ID.CALLS.j=thisuser
  101.   END
  102.   ontime=WORD(lynes.19,1)*60+WORD(lynes.19,3)
  103.   counts.MINUTES=counts.MINUTES+ontime
  104.   DO j=HOW_MANY TO 1 BY -1 WHILE ontime>counts.ON_MINS.j
  105.     jj=j+1
  106.     counts.ON_MINS.jj=counts.ON_MINS.j
  107.     counts.ID.ON_MINS.jj=counts.ID.ON_MINS.j
  108.     counts.ON_MINS.j=ontime
  109.     counts.ID.ON_MINS.j=thisuser
  110.   END
  111.   IF WORDS(lynes.12)>3 & DATATYPE(WORD(lynes.12,4),'N') THEN
  112.     DO
  113.       counts.AGE_INDEX=counts.AGE_INDEX+1
  114.       age=0
  115.       IF UPPER(WORD(lynes.12,3))='AGE:' THEN
  116.         DO
  117.           age=WORD(lynes.12,4)
  118.           counts.AGE_TOTAL=counts.AGE_TOTAL+age
  119.         END
  120.       ELSE IF UPPER(WORD(lynes.12,3))='BIRTHDAY:' THEN
  121.         DO
  122.           age=LEFT(DATE('S'),4)-LEFT(WORD(lynes.12,4),4)
  123.           counts.AGE_TOTAL=counts.AGE_TOTAL+age
  124.           IF SUBSTR(DATE('S'),5,2)<SUBSTR(WORD(lynes.12,4),5,2) THEN
  125.             DO
  126.               counts.AGE_TOTAL=counts.AGE_TOTAL-1
  127.               age=age-1
  128.             END
  129.         END
  130.       IF age>0 & age<counts.AGE_YOUNGEST THEN counts.AGE_YOUNGEST=age
  131.       IF age>counts.AGE_OLDEST THEN counts.AGE_OLDEST=age
  132.     END
  133.   idate=DATE('I',STRIP(WORD(lynes.13,1)),'S')
  134.   days=ndate-idate
  135.   IF days<11 THEN ten=ten+1
  136.   IF days<31 THEN thirty=thirty+1
  137.   IF days<91 THEN ninty=ninty+1
  138.   IF days<183 THEN sixmo=sixmo+1
  139.   upfiles=0
  140.   upbytes=1
  141.   dnfiles=0
  142.   dnbytes=1
  143.   IF WORDS(lynes.14)>3 THEN
  144.     DO
  145.       upfiles=WORD(lynes.14,1)
  146.       upbytes=WORD(lynes.14,3)
  147.     END
  148.   IF WORDS(lynes.15)>3 THEN
  149.     DO
  150.       dnfiles=WORD(lynes.15,1)
  151.       dnbytes=WORD(lynes.15,3)
  152.     END
  153.   IF upbytes<1 THEN upbytes=1
  154.   counts.UP_FILES=counts.UP_FILES+upfiles
  155.   counts.UP_BYTES=counts.UP_BYTES+upbytes
  156.   counts.DN_FILES=counts.DN_FILES+dnfiles
  157.   counts.DN_BYTES=counts.DN_BYTES+dnbytes
  158.   DO j=HOW_MANY TO 1 BY -1 WHILE upfiles>counts.HIGH.UP_FILES.j
  159.     jj=j+1
  160.     counts.HIGH.UP_FILES.jj=counts.HIGH.UP_FILES.j
  161.     counts.ID.UP_FILES.jj=counts.ID.UP_FILES.j
  162.     counts.HIGH.UP_FILES.j=upfiles
  163.     counts.ID.UP_FILES.j=thisuser
  164.   END
  165.   DO j=HOW_MANY TO 1 BY -1 WHILE upbytes>counts.HIGH.UP_BYTES.j
  166.     jj=j+1
  167.     counts.HIGH.UP_BYTES.jj=counts.HIGH.UP_BYTES.j
  168.     counts.ID.UP_BYTES.jj=counts.ID.UP_BYTES.j
  169.     counts.HIGH.UP_BYTES.j=upbytes
  170.     counts.ID.UP_BYTES.j=thisuser
  171.   END
  172.   DO j=HOW_MANY TO 1 BY -1 WHILE dnfiles>counts.HIGH.DN_FILES.j
  173.     jj=j+1
  174.     counts.HIGH.DN_FILES.jj=counts.HIGH.DN_FILES.j
  175.     counts.ID.DN_FILES.jj=counts.ID.DN_FILES.j
  176.     counts.HIGH.DN_FILES.j=dnfiles
  177.     counts.ID.DN_FILES.j=thisuser
  178.   END
  179.   DO j=HOW_MANY TO 1 BY -1 WHILE dnbytes>counts.HIGH.DN_BYTES.j
  180.     jj=j+1
  181.     counts.HIGH.DN_BYTES.jj=counts.HIGH.DN_BYTES.j
  182.     counts.ID.DN_BYTES.jj=counts.ID.DN_BYTES.j
  183.     counts.HIGH.DN_BYTES.j=dnbytes
  184.     counts.ID.DN_BYTES.j=thisuser
  185.   END
  186.   IF (dnbytes=1)&(upbytes=1) THEN NOP
  187.   ELSE
  188.     DO j=HOW_MANY TO 1 BY -1 WHILE (dnbytes/upbytes)<counts.LOW.j
  189.       jj=j+1
  190.       counts.LOW.jj=counts.LOW.j
  191.       counts.ID.LOW.jj=counts.ID.LOW.j
  192.       counts.LOW.j=dnbytes/upbytes
  193.       counts.ID.LOW.j=thisuser
  194.     END
  195.   DO j=HOW_MANY TO 1 BY -1 WHILE (dnbytes/upbytes)>counts.HIGH.j
  196.     jj=j+1
  197.     counts.HIGH.jj=counts.HIGH.j
  198.     counts.ID.HIGH.jj=counts.ID.HIGH.j
  199.     counts.HIGH.j=dnbytes/upbytes
  200.     counts.ID.HIGH.j=thisuser
  201.   END
  202.   totwrit=0
  203.   DO j=1 TO 99
  204.     thisnum=WORD(lynes.23,j)
  205.     IF DATATYPE(thisnum,'N') THEN totwrit=totwrit+thisnum
  206.   END
  207.   DO j=HOW_MANY TO 1 BY -1 WHILE totwrit>counts.HIGH.MSGS.j
  208.     jj=j+1
  209.     counts.HIGH.MSGS.jj=counts.HIGH.MSGS.j
  210.     counts.ID.MSGS.jj=counts.ID.MSGS.j
  211.     counts.HIGH.MSGS.j=totwrit
  212.     counts.ID.MSGS.j=thisuser
  213.   END
  214. END
  215.  
  216.  
  217. /* OUTPUT */
  218.  
  219. IF inarg='' THEN inarg=bbspath'Information/STATS.USER'
  220. IF UPPER(inarg)~='CLI' THEN
  221.   DO
  222.     CALL CLOSE(STDOUT)
  223.     CALL OPEN(STDOUT,inarg,'W')
  224.     IF x=0 THEN
  225.       DO
  226.         SAY inarg 'would not open for writing!'
  227.         CALL SETCLIP('BBS_STAT')
  228.         EXIT(20)
  229.       END
  230.   END
  231.  
  232. SAY LEFT('-',75,'-')
  233. SAY CENTER(bbsname 'USER statistics through' DATE() 'at' TIME('C'),75)
  234. SAY LEFT('-',75,'-')
  235. SAY CENTER('Does not include sysop.',75)
  236. SAY LEFT('-',75,'-')
  237. SAY
  238. IF counts.AGE_INDEX>0 THEN
  239.   SAY CENTER('Of' WORDS(userlist) 'total users,' counts.AGE_INDEX 'gave their ages.',75)
  240.   SAY CENTER('The youngest is' counts.AGE_YOUNGEST'    The oldest is' counts.AGE_OLDEST'    The average is' TRUNC(counts.AGE_TOTAL/counts.AGE_INDEX+.005,2),75)
  241. SAY
  242. SAY RIGHT(comma(counts.UP_BYTES),15) 'bytes in' RIGHT(comma(counts.UP_FILES),7) 'files have been uploaded by these users.'
  243. SAY RIGHT(comma(counts.DN_BYTES),15) 'bytes in' RIGHT(comma(counts.DN_FILES),7) 'files have been downloaded by these users.'
  244. SAY
  245. SAY
  246. SAY 'Most public  messages:' RIGHT(comma(counts.HIGH.MSGS.1),14) counts.ID.MSGS.1
  247. DO j=2 TO HOW_MANY
  248.   IF counts.HIGH.MSGS.j>0 THEN
  249.     SAY RIGHT(comma(counts.HIGH.MSGS.j),37) counts.ID.MSGS.j
  250. END
  251. SAY
  252. SAY 'Most files   uploaded:' RIGHT(comma(counts.HIGH.UP_FILES.1),14) counts.ID.UP_FILES.1
  253. DO j=2 TO HOW_MANY
  254.   IF counts.HIGH.UP_FILES.j>0 THEN
  255.     SAY RIGHT(comma(counts.HIGH.UP_FILES.j),37) counts.ID.UP_FILES.j
  256. END
  257. SAY
  258. SAY 'Most bytes   uploaded:' RIGHT(comma(counts.HIGH.UP_BYTES.1),14) counts.ID.UP_BYTES.1
  259. DO j=2 TO HOW_MANY
  260.   IF counts.HIGH.UP_BYTES.j>0 THEN
  261.     SAY RIGHT(comma(counts.HIGH.UP_BYTES.j),37) counts.ID.UP_BYTES.j
  262. END
  263. SAY
  264. SAY 'Most files downloaded:' RIGHT(comma(counts.HIGH.DN_FILES.1),14) counts.ID.DN_FILES.1
  265. DO j=2 TO HOW_MANY
  266.   IF counts.HIGH.DN_FILES.j>0 THEN
  267.     SAY RIGHT(comma(counts.HIGH.DN_FILES.j),37) counts.ID.DN_FILES.j
  268. END
  269. SAY
  270. SAY 'Most bytes downloaded:' RIGHT(comma(counts.HIGH.DN_BYTES.1),14) counts.ID.DN_BYTES.1
  271. DO j=2 TO HOW_MANY
  272.   IF counts.HIGH.DN_BYTES.j>0 THEN
  273.     SAY RIGHT(comma(counts.HIGH.DN_BYTES.j),37) counts.ID.DN_BYTES.j
  274. END
  275. SAY
  276. SAY
  277. SAY 'Best  (lowest)  ratio, downloads divided by uploads:'
  278. DO j=1 TO HOW_MANY
  279.   IF counts.LOW.j<999999999 THEN
  280.     SAY RIGHT(comma(counts.LOW.j%1)||RIGHT(TRUNC(counts.LOW.j+.000005,5),6),37) counts.ID.LOW.j
  281. END
  282. SAY
  283. SAY 'Worst (highest) ratio, downloads divided by uploads:'
  284. DO j=1 TO HOW_MANY
  285.   IF counts.HIGH.j>0 THEN
  286.     SAY RIGHT(comma(counts.HIGH.j%1),37) counts.ID.HIGH.j
  287. END
  288. SAY
  289. SAY 'Most Calls To' bbsname':'
  290. DO j=1 TO HOW_MANY
  291.   IF counts.CALLS.j>0 THEN
  292.     SAY RIGHT(comma(counts.CALLS.j%1),37) counts.ID.CALLS.j
  293. END
  294. SAY
  295. SAY 'Most Time Spent On' bbsname':'
  296. DO j=1 TO HOW_MANY
  297.   IF counts.ON_MINS.j>0 THEN
  298.     DO
  299.       temp=comma(counts.ON_MINS.j%60) 'hours'
  300.       temp2=counts.ON_MINS.j//60
  301.       IF temp2<10 THEN temp2='0'temp2
  302.       temp=RIGHT(temp temp2 'minutes',37)
  303.       SAY temp counts.ID.ON_MINS.j
  304.     END
  305. END
  306. SAY
  307. SAY RIGHT(comma(counts.MINUTES),37) 'minutes.'
  308. SAY RIGHT(comma(counts.CALLS),37) 'calls.'
  309. SAY RIGHT('----------',39)
  310. SAY RIGHT(TRUNC(.05+counts.MINUTES/counts.CALLS,1),39) 'minutes per call.'
  311. SAY
  312. users=WORDS(userlist)
  313. SAY RIGHT(comma(users),7) 'users.'
  314. SAY RIGHT(comma(sixmo),7)',' RIGHT(((sixmo*100)/users)%1,2)'%, have called in the last 6 months.'
  315. SAY RIGHT(comma(ninty),7)',' RIGHT(((ninty*100)/users)%1,2)'%, have called in the last 90 days.'
  316. SAY RIGHT(comma(thirty),7)',' RIGHT(((thirty*100)/users)%1,2)'%, have called in the last 30 days.'
  317. SAY RIGHT(comma(ten),7)',' RIGHT(((ten*100)/users)%1,2)'%, have called in the last 10 days.'
  318. SAY
  319. t=(.5+TIME('E'))%1
  320. min=t%60
  321. hrs=min%60
  322. min=min//60
  323. sec=t//60
  324. temp=' - It took'
  325. IF hrs>1 THEN temp=temp hrs 'hours'
  326. ELSE IF hrs=1 THEN temp=temp '1 hour'
  327. IF min>1 THEN temp=temp min 'minutes'
  328. ELSE IF min=1 THEN temp=temp '1 minute'
  329. temp=temp sec 'seconds to compile this report. -'
  330. SAY temp
  331. SAY
  332. CALL SETCLIP('BBS_STAT')
  333. EXIT;
  334.  
  335.  
  336. comma:
  337. ARG num .
  338. dgt=LENGTH(num)
  339. numtext=''
  340. IF dgt>3 THEN numtext=','RIGHT(num,3)
  341. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  342. IF dgt>9 THEN
  343.   DO
  344.     numtext=','LEFT(RIGHT(num,9),3)||numtext
  345.     numtext=LEFT(num,dgt-9)||numtext
  346.   END
  347. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  348. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  349. ELSE numtext=num
  350. RETURN(numtext)
  351.  
  352.  
  353. SYNTAX:
  354. FAILURE:
  355. ERROR:
  356. SAY 'Line:' SIGL ERRORTEXT(RC)
  357. SAY thisuser
  358. SAY
  359. CALL SETCLIP('BBS_STAT')
  360. EXIT;
  361.  
  362. /* end of bbsUSER.rexx */
  363.